/*	--- JSP开发 ---

我们从【前面的章节】可以看到, 【Servlet】就是一个【能处理HTTP请求, 发送HTTP响应的"小程序"】, 而【发送响应】无非就是【获取PrintWriter, 然后输出HTML】： */
Printwriter pw = resp.getWriter();
pw.write("<html>");
pw.write("<body>");
pw.write("<h1>Welcome, " + name + "!</h1>");
pw.write("</body>");
pw.write("</html>");

pw.flush();


/*
只不过, 用【PrintWriter】输出【HTML】比较痛苦, 因为【不但要正确编写HTML】, 还需要【插入各种变量】。

如果想在【Servlet】中输出一个类似新浪首页的HTML, 写对HTML基本上不太可能。

Q: 那有没有【更简单的输出HTML的办法】？
A: 有！我们可以使用JSP。

【JSP】是【Java Server Pages的缩写】，【JSP的文件】必须放到【/src/main/webapp/下】，【文件名】必须以【.jsp】结尾

【整个文件】与【HTML】并无太大区别，但需要【插入变量】，或者【动态输出的地方】，使用【特殊指令<% ... %>】。

我们来【编写一个hello.jsp】，内容如下： 

<html>
<head>
	<title>Hello World - JSP </title>
</head>

<body>
	<%-- JSP Comment --%>
	<h1>Hello World!</h1>
	<p>
		<%
			out.println("Your IP address is ");
		%>

		<span style="color:red">
			<%=request.getRemoteAddr() %>
		</span>
	</p>
</body>

</html>


/*
【整个JSP的内容】实际上是【一个HTML】，但是【稍有不同】：

· 包含在 <%--  --%>之间 的是【JSP的注释】，它们会被【完全忽略】；
· 包含在 <%  %>之间 的是【Java代码】，可以编写【任意Java代码】；
· 如果使用 <%= xxx %> 则可以【快捷输出一个变量的值】。


【JSP页面】内置了【几个变量】：

· out：表示HttpServletResponse的PrintWriter；
· session：表示当前HttpSession对象；
· request：表示HttpServletRequest对象。


这【几个变量】可以【直接使用】。

【访问JSP页面】时，直接指定【完整路径】。
例如，http://localhost:8080/hello.jsp

【浏览器显示】如下：
	Path/1.jpg


--------------------------------------

Q: JSP 和 Servlet 有什么【区别】？
A: 其实它们【没有任何区别】，因为【JSP】在【执行前】首先【被编译】成【一个Servlet】。

在【Tomcat的临时目录下】，可以找到【一个hello_jsp.java的源文件】，【这个文件】就是【Tomcat】把【JSP】自动转换成的【Servlet源码】

示意图: 
	Jsp  ---Tomcat-->  Servlet源码.java
*/
package org.apache.jsp;

import ...

public final class hello_jsp extends org.apache.jasper.runtime.HttpJspBase 
	implements org.apache.jasper.runtime.JspSourceDependent,
			   org.apache.jasper.runtime.JspSourceImports {

    //...
    
    public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {
    	//...
    	out.write("<html>\n");
    	out.write("<head>\n");
    	out.write("    <title>Hello World - JSP</title>\n");
    	out.write("</head>\n");
    	out.write("<body>\n");
    	//...
    	out.write("</body>\n");
    	out.write("</html>\n");
    }

    //...
}


/*
可见【JSP本质】上就是【一个Servlet】，只不过【无需配置映射路径】，【Web Server】会根据【路径】查找【对应的.jsp文件】，如果找到了，就【自动编译成Servlet】再执行。

在【服务器运行】过程中，如果修改了【JSP的内容】，那么【服务器】会【自动重新编译】。


===============================================

#	JSP高级功能

【JSP的指令】非常复杂，除了<% ... %>外，

【JSP页面】本身可以【通过page指令】引入【Java类】： 

<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>


这样【后续的Java代码】才能引用【简单类名】而不是【完整类名】。

使用【include指令】可以【引入另一个JSP文件】： 

<html>
<body>
	<%@ include file="header.jsp" %>
	<h1> Index Page </h1>
	<%@ include file="footer.jsp" %>
</body>


==================================================

#	JSP Tag

【JSP】还允许【自定义输出的tag】，例如： 

<c:out value = "${sessionScope.user.name}" />

【JSP Tag】需要正确引入【taglib的jar包】，并且还需要【正确声明】，使用起来【非常复杂】

对于【页面开发】来说，【不推荐使用JSP Tag】

因为我们后续会介绍【更简单的模板引擎】，这里我们【不再介绍如何使用taglib】。


===========================================================

#	练习

编写一个简单的JSP文件，输出当前日期和时间。 */



/*=============================================================

#	----- JSP开发 の 小结 -----

1. 【JSP】是一种【在HTML中】嵌入【动态输出的文件】，它和【Servlet】正好相反
   【Servlet】是在【Java代码】中嵌入【输出HTML】；

2. 【JSP】可以引入并【使用JSP Tag】，但由于【其语法复杂】，【不推荐使用】；

3. 【JSP本身】目前【已经很少使用】，我们只需要【了解其基本用法】即可。


==================================

JSP 汇总:
	<%--  --%> 注释
	<% Java %> 代码
	<%= v1  %> Java变量输出
	<%@ page import="java.io.*" %> 引入Java类
	<%@ include file="header.jsp" %> 引入另一个jsp文件
	<c:out value="${sessionScope.user.name}"/> 输出"自定义的JSP_Tag"
		(JSP Tag需要正确引入taglib的jar包，并且还需要正确声明)
============================================

JSP模板(hello.jsp): 
---------------------------------
<html>
<head>
    <title>Hello World - JSP</title>
</head>
<body>
    <%-- JSP Comment --%>
    <h1>Hello World!</h1>
    <p>
    <%
         out.println("Your IP address is ");
    %>
    <span style="color:red">
        <%= request.getRemoteAddr() %>
    </span>
    </p>
</body>
</html>
-------------------------------------
*/































































